<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .father{
            height: 200px;
            width: 200px;
            background-color: pink;
        }
        .son{
            width: 100px;
            height: 100px;
            background-color: red;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son">son盒子</div>
    </div>
    <script>
        /*事件流描述的是页面中接收事件的顺序
            事件发生时会在元素节点之间按照特定的顺序传播，
            这个传播过程即为DOM事件流
        */
        //比如给一个div注册了点击事件：
        //DOM事件流有三个阶段
        //1.捕获阶段  Documengt-> Element.html -> Element.body ->Element div
        //2.当前目标阶段  如获取点击事件
        //3.冒泡阶段  div ->body ->html ->document
        /* 1.js代码中只能执行捕获或者冒泡其中的一个阶段
            2.onclick和attachEvent只能得到冒泡阶段*
            addEventListener（type，listener[,useCapture]）第三个参数如果是true
             表示再事件捕获阶段调用事件处理程序；如果是false，表示再事件冒泡阶段
             调用事件处理程序*/
           
             //根据Dom事件流 先执行并弹出的是fahter
             //而不是按js从上到下执行顺序先执行弹出son
             //冒泡，如果addEventListenrer第三个参数是false或者省略 那么处于冒泡阶段
            //  Documengt-> Element.html -> Element.body ->Element div
             var son =document.querySelector('.son');
             son.addEventListener('click',function(e){
                 alert('son1');
                //  e.stopPropagation();//阻止冒泡，不再向上传播 标准
                //e.cancelBubble = true;//非标准阻止冒泡  IE-6-8利用事件对象cancelBubble属性
                //解决兼容性问题
                if(e && e.stopPropagation){
                    e.stopPropagation();
                }else{
                    window.event.cancelBubble =true;
                }
             },false);
             var father =document.querySelector('.father');
             father.addEventListener('click',function(){
                 alert('father1');
             },false);
          
</script>
</body>
</html>